package edu.client;

import java.util.LinkedList;
import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.VentasService.VentasService;
import edu.client.VentasService.VentasServiceAsync;
import edu.shared.DTO.EmpleadoDTO;
import edu.shared.DTO.OrdenPedidoDTO;

import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.HTMLTable.Cell;

public class P_EditarOrdenPedidoSeleccion extends Composite {
	
		private static final int CHECK = 0;
		private static final int NRO_ORDEN_PEDIDO = 1;
		private static final int CLIENTE = 2;
		private static final int ESTADO = 3;
		private static final int FECHA_PREVISTA_ENTREGA = 4;
		private static final int MAS_INFORMACION = 5;
		
		private Constantes constante = GWT.create(Constantes.class);
		private String tituloTab;

		TabPanel padre;
		private FlexTable ordenesPedidoFt;

		private TextBox nroOrdenPedidoTb;
		private ListBox estadoLb;
		private ListBox clienteLb;

		private Button buscarBtn;

		public List<EmpleadoDTO> listaEmpleados;
		public List<String> listaEmpleadosACargo;
		public List<OrdenPedidoDTO> ordenesPedidoDTO;
		private Button editarOrdenPedidoBtn;
		
		public P_EditarOrdenPedidoSeleccion(TabPanel padre, String titulo) {

			this.tituloTab = titulo;
			this.padre = padre;
			
			LayoutPanel layoutPanel = new LayoutPanel();
			initWidget(layoutPanel);
			layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "637px");
			
			//BÚSQUEDA SIN CRITERIOS
			
			VentasServiceAsync ventasService = GWT.create(VentasService.class);

			ventasService.buscarOrdenesPedido(new AsyncCallback<List<OrdenPedidoDTO>>() {
				@Override
				public void onSuccess(List<OrdenPedidoDTO> result) {
					
					ordenesPedidoDTO = new LinkedList<OrdenPedidoDTO>();
					
					for (OrdenPedidoDTO ordenPedidoDTO : result) {
						if ((!ordenPedidoDTO.getEstado().equals("GENERADA"))&&(!ordenPedidoDTO.getEstado().equals("CERRADA"))&&(!ordenPedidoDTO.getEstado().equals("FABRICACIÓN")))
							ordenesPedidoDTO.add(ordenPedidoDTO);
					}
						
					cargarOrdenesPedido(ordenesPedidoDTO);
				}

				@Override
				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO");
				}
			});
			
			ventasService.getNombresEmpresas(new AsyncCallback<List<String>>() {
				public void onSuccess(List<String> result) {
					
					clienteLb.addItem("TODOS LOS CLIENTES");
					clienteLb.addItem("ORDEN PLANIFICADA");
					
					for (int i = 0; i < result.size(); i++)
						clienteLb.addItem(result.get(i).toUpperCase());
				}

				public void onFailure(Throwable caught) {
					Window.alert("ERROR EN EL SERVICIO");
				}
			});
			
			// SECCIÓN DATOS DE FILTRADO
			
			Label buscarPorLabel = new Label("FILTROS");
			buscarPorLabel.setStyleName("labelTitulo");
			layoutPanel.add(buscarPorLabel);
			layoutPanel.setWidgetLeftWidth(buscarPorLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(buscarPorLabel, 15.0, Unit.PX, 50.0, Unit.PX);
			
			Label nroOrdenPedidoLabel = new Label("Nº ORDEN DE PEDIDO:");
			nroOrdenPedidoLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
			nroOrdenPedidoLabel.setStyleName("gwt-LabelFormulario");
			layoutPanel.add(nroOrdenPedidoLabel);
			layoutPanel.setWidgetLeftWidth(nroOrdenPedidoLabel, 2.0, Unit.PCT, 13.2, Unit.PCT);
			layoutPanel.setWidgetTopHeight(nroOrdenPedidoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
			
			nroOrdenPedidoTb = new TextBox();
			layoutPanel.add(nroOrdenPedidoTb);
			layoutPanel.setWidgetLeftWidth(nroOrdenPedidoTb, 15.5, Unit.PCT, 20.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(nroOrdenPedidoTb, 65.0, Unit.PX, 32.0, Unit.PX);
			
			Label clienteLabel = new Label("CLIENTE:");
			clienteLabel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
			clienteLabel.setStyleName("gwt-LabelFormulario");
			layoutPanel.add(clienteLabel);
			layoutPanel.setWidgetLeftWidth(clienteLabel, 39.0, Unit.PCT, 5.2, Unit.PCT);
			layoutPanel.setWidgetTopHeight(clienteLabel, 70.0, Unit.PX, 19.0, Unit.PX);
			
			clienteLb = new ListBox();
			layoutPanel.add(clienteLb);
			layoutPanel.setWidgetLeftWidth(clienteLb, 44.5, Unit.PCT, 20.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(clienteLb, 65.0, Unit.PX, 32.0, Unit.PX);
			
			Label estadoLabel = new Label("ESTADO:");
			estadoLabel.setStyleName("gwt-LabelFormulario");
			layoutPanel.add(estadoLabel);
			layoutPanel.setWidgetLeftWidth(estadoLabel, 69.5, Unit.PCT, 5.2, Unit.PCT);
			layoutPanel.setWidgetTopHeight(estadoLabel, 70.0, Unit.PX, 19.0, Unit.PX);
			
			estadoLb = new ListBox();
			layoutPanel.add(estadoLb);
			layoutPanel.setWidgetLeftWidth(estadoLb, 75.0, Unit.PCT, 20.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(estadoLb, 65.0, Unit.PX, 32.0, Unit.PX);
			
			estadoLb.addItem("TODOS LOS ESTADOS");
			estadoLb.addItem("GUARDADA");
			estadoLb.addItem("INGENIERÍA");
			estadoLb.addItem("PROVISORIA");
			
			buscarBtn = new Button("BUSCAR");			
			layoutPanel.add(buscarBtn);
			layoutPanel.setWidgetLeftWidth(buscarBtn, 45.0, Unit.PCT, 10.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(buscarBtn, 120.0, Unit.PX, 28.0, Unit.PX);
			
			buscarBtn.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					for (int i = 1; i < ordenesPedidoFt.getRowCount(); i++) {
						ordenesPedidoFt.removeRow(i);
					}
					String nroOrdenCriterio = nroOrdenPedidoTb.getText();
					String clienteCriterio = clienteLb.getItemText(clienteLb.getSelectedIndex());
					String estadoCriterio = estadoLb.getItemText(estadoLb.getSelectedIndex());
					filtrarCriterios(ordenesPedidoDTO, nroOrdenCriterio, clienteCriterio, estadoCriterio);
				}
			});
			
			Label ordenesPedidoLabel = new Label("ÓRDENES DE PEDIDO");
			ordenesPedidoLabel.setStyleName("labelTitulo");
			layoutPanel.add(ordenesPedidoLabel);
			layoutPanel.setWidgetLeftWidth(ordenesPedidoLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(ordenesPedidoLabel, 160.0, Unit.PX, 50.0, Unit.PX);
			
			ScrollPanel contenedorOrdenesPedidoSp = new ScrollPanel();
			contenedorOrdenesPedidoSp.setStyleName("tabla");
			layoutPanel.add(contenedorOrdenesPedidoSp);
			layoutPanel.setWidgetLeftWidth(contenedorOrdenesPedidoSp, 4.9, Unit.PCT, 90.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(contenedorOrdenesPedidoSp, 225.0, Unit.PX, 250.0, Unit.PX);
			
			ordenesPedidoFt = new FlexTable();
			contenedorOrdenesPedidoSp.setWidget(ordenesPedidoFt);
			ordenesPedidoFt.setSize("100%", "100%");
			ordenesPedidoFt.setText(0, CHECK, "");
			ordenesPedidoFt.getCellFormatter().setWidth(0, CHECK, "4%");
			ordenesPedidoFt.setText(0, NRO_ORDEN_PEDIDO, "Nº ORDEN PEDIDO");
			ordenesPedidoFt.getCellFormatter().setWidth(0, NRO_ORDEN_PEDIDO, "22%");
			ordenesPedidoFt.setText(0, CLIENTE, "CLIENTE");
			ordenesPedidoFt.getCellFormatter().setWidth(0, CLIENTE, "22%");
			ordenesPedidoFt.setText(0, ESTADO,"ESTADO");
			ordenesPedidoFt.getCellFormatter().setWidth(0, ESTADO, "22%");
			ordenesPedidoFt.setText(0, FECHA_PREVISTA_ENTREGA, "FECHA PREVISTA ENTREGA");
			ordenesPedidoFt.getCellFormatter().setWidth(0, FECHA_PREVISTA_ENTREGA, "22%");
			ordenesPedidoFt.setText(0, MAS_INFORMACION, constante.masInformacion());
			ordenesPedidoFt.getCellFormatter().setWidth(0, MAS_INFORMACION, "8%");
			ordenesPedidoFt.getRowFormatter().addStyleName(0, "tablaEncabezado");
			
			//Sección pie.
			Label pieLabel = new Label("");
			pieLabel.setStyleName("labelTitulo");
			layoutPanel.add(pieLabel);
			layoutPanel.setWidgetLeftWidth(pieLabel, 2.5, Unit.PCT, 95.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(pieLabel, 500.0, Unit.PX, 50.0, Unit.PX);
			
			Button salirBtn = new Button("CANCELAR");
			layoutPanel.add(salirBtn);
			layoutPanel.setWidgetRightWidth(salirBtn, 5.0, Unit.PCT, 10.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(salirBtn, 575.0, Unit.PX, 28.0, Unit.PX);
			
			salirBtn.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					salir(event);
				}
			});
			
			editarOrdenPedidoBtn = new Button("EDITAR");
			layoutPanel.add(editarOrdenPedidoBtn);
			layoutPanel.setWidgetRightWidth(editarOrdenPedidoBtn, 17.5, Unit.PCT, 10.0, Unit.PCT);
			layoutPanel.setWidgetTopHeight(editarOrdenPedidoBtn, 575.0, Unit.PX, 28.0, Unit.PX);
			
			editarOrdenPedidoBtn.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					long ordenSeleccionada = Long.parseLong(ordenSeleccionada());
					if (ordenSeleccionada == -1)
						Window.alert("Seleccione una orden de pedido.");
					else	
						editarOrdenPedido(ordenSeleccionada);
				}
			});
	}
		
		private void cargarOrdenesPedido(List<OrdenPedidoDTO> ordenesPedidoDTO) {
			
			int cantidadFilas = ordenesPedidoFt.getRowCount();
			
			for (int i = 1; i < cantidadFilas; i++) {
				ordenesPedidoFt.removeRow(1);
			}
			
			if(ordenesPedidoDTO.size() == 0)
				Window.alert("No existen órdenes de pedido que cumplan con los criterios de búsqueda.");
			
			for (int i = 0; i < ordenesPedidoDTO.size(); i++) {

				Label info = new Label("");
				info.setSize("16px", "16px");
				info.setStyleName("labelInfo");
				
				DateTimeFormat fmtDate = DateTimeFormat.getFormat("dd/MM/yyyy");
				String fechaPrevistaEntrega = "";
				
				if (ordenesPedidoDTO.get(i).getFechaPrevistaEntrega() != null)
					fechaPrevistaEntrega = fmtDate.format(ordenesPedidoDTO.get(i).getFechaPrevistaEntrega());
				
				RadioButton radioButton = new RadioButton("Orden seleccionada","");
				
				ordenesPedidoFt.setWidget(i + 1, CHECK, radioButton);
				ordenesPedidoFt.getFlexCellFormatter().setHorizontalAlignment(i + 1, CHECK, HasHorizontalAlignment.ALIGN_CENTER);
				ordenesPedidoFt.setWidget(i + 1, NRO_ORDEN_PEDIDO, new Label(String.valueOf(ordenesPedidoDTO.get(i).getNroOrden())));
				ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, NRO_ORDEN_PEDIDO, true);
				ordenesPedidoFt.setWidget(i + 1, CLIENTE, new Label(ordenesPedidoDTO.get(i).getNombreCliente()));
				ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, CLIENTE, true);
				ordenesPedidoFt.setWidget(i + 1, ESTADO, new Label(ordenesPedidoDTO.get(i).getEstado()));
				ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, ESTADO, false);
				ordenesPedidoFt.setWidget(i + 1, FECHA_PREVISTA_ENTREGA, new Label(fechaPrevistaEntrega));
				ordenesPedidoFt.getCellFormatter().setWordWrap(i+1, FECHA_PREVISTA_ENTREGA, true);
				ordenesPedidoFt.setWidget(i + 1, MAS_INFORMACION, info);
				ordenesPedidoFt.getFlexCellFormatter().setHorizontalAlignment(i + 1, MAS_INFORMACION, HasHorizontalAlignment.ALIGN_CENTER);
				ordenesPedidoFt.getRowFormatter().setStyleName(i + 1, "tablaRenglon");
				
				info.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent event) {
						Cell celda = ordenesPedidoFt.getCellForEvent(event);
						masInformacionOrdenPedido(celda);
					}
				});
			}
		}
		
		
		private void filtrarCriterios(List<OrdenPedidoDTO> ordenesPedidoDTO, String nroOrdenCriterio, String clienteCriterio, String estadoCriterio) {
			
			List<OrdenPedidoDTO> ordenesPedidoListar = new LinkedList<OrdenPedidoDTO>();
			
			for (int i = 0; i < ordenesPedidoDTO.size(); i++) {

				String nroOrden = String.valueOf(ordenesPedidoDTO.get(i).getNroOrden());
				String cliente = ordenesPedidoDTO.get(i).getNombreCliente();
				String estado = ordenesPedidoDTO.get(i).getEstado();
				
				if ((clienteCriterio.equals("TODOS LOS CLIENTES"))||(cliente.toUpperCase().equals(clienteCriterio))) {
					if ((estadoCriterio.equals("TODOS LOS ESTADOS"))||(estado.equals(estadoCriterio))) {
						if (nroOrden.startsWith(nroOrdenCriterio)) {
							ordenesPedidoListar.add(ordenesPedidoDTO.get(i));
						}
					}
				}
			}

			cargarOrdenesPedido(ordenesPedidoListar);
		}
		
		
		private void masInformacionOrdenPedido(Cell celda) {	
			
			long nroOrdenPedido = Long.parseLong(ordenesPedidoFt.getText(celda.getRowIndex(), 1));
			
			final P_DetalleOrdenPedido popUp = new P_DetalleOrdenPedido(nroOrdenPedido);
			popUp.setGlassEnabled(true);
			popUp.center();
			popUp.show();
		}
		
		public void editarOrdenPedido(long nroOrdenPedido) {
			
			int ancho = Window.getClientWidth() - 15;
			int alto = Window.getClientHeight() - 13;
			P_EditarOrdenPedido p_editarOrdenPedido = new P_EditarOrdenPedido(padre,tituloTab, nroOrdenPedido);
			
			this.getParent().removeFromParent();
			ScrollPanel formulario = new ScrollPanel();
			formulario.setTitle(tituloTab);
			formulario.setStyleName("panelFormulario");
			formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
			formulario.add(p_editarOrdenPedido);
			padre.add(formulario, tituloTab, false);
			padre.selectTab(Validaciones.numeroElemento(padre, tituloTab));
			
			padre.setSize((ancho - 5) + "px", (alto - 90) + "px");

			for(int i = 0; i < padre.getWidgetCount(); i++)
				padre.getWidget(i).setSize((ancho - 20) + "px", (alto - 145) + "px");
		}
		
		public String ordenSeleccionada() {
			String ordenSeleccionada = "-1";

			for(int i=1; i< ordenesPedidoFt.getRowCount(); i++){
				RadioButton radiobutton = (RadioButton) ordenesPedidoFt.getWidget(i, CHECK);
				
				if(radiobutton.getValue() == true)
					ordenSeleccionada = ordenesPedidoFt.getText(i, 1);
			}
			
			return ordenSeleccionada;
		}
		
		public void salir(ClickEvent event) {
			padre.remove(Validaciones.numeroElemento(padre, tituloTab));
		}
}
